<?php

namespace Xin\Pipeline\Contracts;

interface Repository
{
	/**
	 * 获取所有的场景器
	 * @return array-key<string,callable[]>
	 */
	public function all();

	/**
	 * 获取场景器
	 * @param string $name
	 * @return callable[]
	 */
	public function get($name = 'global');

	/**
	 * 添加场景器
	 * @param callable $handler
	 * @param string $name
	 * @return $this
	 */
	public function push(callable $handler, $name = 'global');

	/**
	 * 添加一组中间件
	 * @param callable[] $handlers
	 * @param string $name
	 * @return $this
	 */
	public function pushMany(array $handlers, $name = 'global');

	/**
	 * 指定位置插入场景器
	 * @param callable $handler
	 * @param int $index
	 * @param string $name
	 * @return $this
	 */
	public function insert(callable $handler, $index = 0, $name = 'global');

	/**
	 * 指定位置插入一组场景器
	 * @param string $name
	 * @param callable[] $handlers
	 * @param int $index
	 * @return $this
	 */
	public function insertMany(array $handlers, $index = 0, $name = 'global');

	/**
	 * 移除场景器
	 * @param callable $handler
	 * @param string $name
	 * @return $this
	 */
	public function remove($handler, $name = 'global');

	/**
	 * 清除场景器
	 * @param string $name
	 * @return $this
	 */
	public function clear($name = 'global');
}
